package com.cmcc.groupcontacts.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 字符串工具
 * 
 * @author 
 * 
 */
public abstract class StringUtil {
	/**
	 * 字符串格式化，例：StringFormatUtils.format("this is {0} string format {1}.", "a",
	 * "utility")
	 * 
	 * @param str
	 * @param args
	 * @return
	 */
	public static String format(String str, Object... args) {
		if (ValidationUtil.isNullOrEmpty(str) || ValidationUtil.isNullOrEmpty(args))
			return "";

		/*
		 * 如果用于生成SQL语句，这里用于在字符串前后加单引号 for(int i=0;i<args.length;i++) { String
		 * type="java.lang.String";
		 * if(type.equals(args[i].getClass().getName()))
		 * args[i]="'"+args[i]+"'"; }
		 */

		String result = str;
		// 匹配{}里面是数字的子字符串
		java.util.regex.Pattern p = java.util.regex.Pattern.compile("\\{(\\d+)\\}");
		java.util.regex.Matcher m = p.matcher(str);

		while (m.find()) {
			// 获取{}里面的数字作为匹配组的下标取值
			int index = Integer.parseInt(m.group(1));
			// 数组越界控制
			if (index < args.length) {
				// 替换，以{}数字为下标，在参数数组中取值
				if (args[index] == null) {
					result = result.replace(m.group(), "");
				} else {
					result = result.replace(m.group(), args[index].toString());
				}
			}
		}
		return result;
	}

	/**
	 * 返回去除空格的字符串,如果为null返回空串
	 * 
	 * @param str
	 * @return
	 */
	public static String trim(String str) {
		if (str == null)
			return "";
		return str.trim();
	}

	/**
	 * 替换回车符和双引号
	 * 
	 * @param str
	 * @return
	 */
	public static String replaceEnterAndQuoteChar(String str) {
		if (str == null)
			return null;
		return str.replaceAll("\n", "").replaceAll("\"", "'");
	}
	
	/**
	 * 移除转义符：\r \n \t \v
	 * 
	 * @param str
	 * @return
	 */
	public static String removeEscapeChar(String str) {
		if (str == null)
			return null;
		return str.replaceAll("\r", "").replaceAll("\n", "").replaceAll("\t", "").replaceAll("\b", "").replaceAll("\f", "");
	}

	/**
	 * 从英文字符串中抓取其中的大写字母
	 * 
	 * @param py
	 * @return
	 */
	public static String getUpperCaseLetters(String py) {
		String upperCase = "";
		for (char ch : py.toCharArray()) {
			if (Character.isUpperCase(ch)) {
				upperCase += ch;
			}
		}
		return upperCase;
	}

	/**
	 * 获取字符串的实际长度，即字符/数字长度为1、中文长度为2
	 * 
	 * @param str
	 * @return
	 */
	public static int getLength(String str) {
		try {
			return new String(str.getBytes("GBK"), "ISO8859_1").length();
		} catch (Exception e) {
			return 0;
		}
	}

	/**
	 * 判断是否是一个中文汉字
	 * 
	 * @param c
	 *            字符
	 * @return
	 */
	public static boolean isChinese(char c) {
		return getLength(String.valueOf(c)) > 1;
	}

	/**
	 * 判断字符串是否含有中文
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isChinese(String s) {
		for (char c : s.toCharArray()) {
			if (getLength(String.valueOf(c)) > 1) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 判断是否为数字
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		return ValidationUtil.IsNumber(str);
	}

	/**
	 * 判断是否为字母
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isLetter(String str) {
		return ValidationUtil.isLetter(str);
	}

	/**
	 * 按字节截取字符串，即字符/数字长度为1、中文长度为2
	 * 
	 * @param value
	 *            原始字符串
	 * @param length
	 *            截取位数
	 * @return
	 */
	public static String substring(String value, int length) {
		if (value == null || "".equals(value)) {
			return "";
		}

		// 要截取的字节数大于0，且小于原始字符串的字节数，否则直接将原字符串返回
		if (length > 0 && length < getLength(value)) {
			StringBuffer buff = new StringBuffer();
			char c;
			for (int i = 0; i < length; i++) {
				c = value.charAt(i);
				if (isChinese(c)) {
					// 遇到中文汉字，截取字节总数减1
					length--;
				}
				if (i < length) {
					buff.append(c);
				}
			}
			return buff.toString();
		} else {
			return value;
		}
	}

	/**
	 * 超出指定长度返回截断式字符串，字符/数字长度为1、中文长度为2<br />
	 * 例如：“联系人分..”
	 * 
	 * @param value
	 * @param length
	 * @return
	 */
	public static String overlength2dots(String value, int length) {
		int byteLength = getLength(value);
		if (byteLength <= length) {
			return value;
		} else {
			return substring(value, length - 1) + "..";
		}
	}

	/**
	 * MD5 加密
	 * 
	 * @param str
	 * @return
	 */
	public static String getMD5Str(String str) {
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance("MD5");
			messageDigest.reset();
			messageDigest.update(str.getBytes("UTF-8"));
		} catch (NoSuchAlgorithmException e) {
			System.exit(-1);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		byte[] byteArray = messageDigest.digest();
		StringBuffer md5StrBuff = new StringBuffer();
		for (int i = 0; i < byteArray.length; i++) {
			if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
				md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
			else
				md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
		}
		// md5 32位
		// return md5StrBuff.toString();
		// md5 16位
		return md5StrBuff.toString().substring(8, 24);
	}
	
	/**
	 * 将空对象转换为空字符串
	 * 
	 * @param str
	 * @return
	 */
	public static String null2String(String str) {
		return (str == null) ? "null" : str; 
	}
}
